package api

import (
	"context"
	"myapp/internal/consts"
	"myapp/internal/model"
	"myapp/internal/service"

	"github.com/gogf/gf/v2/net/ghttp"
)

type sCustomContext struct{}

func init() {
	service.RegisterCustomContext(New())
}

func New() *sCustomContext {
	return &sCustomContext{}
}

// Init 初始化上下文对象指针到上下文对象中，以便后续的请求流程中可以修改。
func (s *sCustomContext) Init(r *ghttp.Request, customCtx *model.CustomContext) {
	r.SetCtxVar(consts.ContextKey, customCtx)
}

// Get 获得上下文变量，如果没有设置，那么返回nil
func (s *sCustomContext) Get(ctx context.Context) *model.CustomContext {
	value := ctx.Value(consts.ContextKey)
	if value == nil {
		return nil
	}
	if localCtx, ok := value.(*model.CustomContext); ok {
		return localCtx
	}
	return nil
}

// SetUser 将上下文信息设置到上下文请求中，注意是完整覆盖
func (s *sCustomContext) SetContextUser(ctx context.Context, ctxUser *model.CustomContextUser) {
	s.Get(ctx).User = ctxUser
}

// 获取登录用户的信息
func (s *sCustomContext) GetContextUser(ctx context.Context) *model.CustomContextUser {
	custom := s.Get(ctx)
	if custom != nil {
		return custom.User
	}
	return nil
}
